#ifndef NETCLIENT_H
#define NETCLIENT_H

#include <QObject>
#include <QNetworkAccessManager>
#include "model/data.h"

namespace model {
class DataCenter;
}

namespace network {

class NetClient : public QObject
{
    Q_OBJECT
public:
    NetClient(model::DataCenter* dataCenter = nullptr);

    // 构建请求ID
    static QString makeRequestId();

    // 封装发送请求的逻辑
    QNetworkReply* sendHttpRequest(const QString& resourcePath, QJsonObject& body);

    // 封装处理响应的逻辑(包括判定 HTTP 正确性, 反序列化, 判定业务上的正确性)
    QJsonObject handleHttpResponse(QNetworkReply* httpResp, bool& ok, QString& reason);

public:
    // 发送hello请求
    void hello();

    // 发送ping请求
    void ping();

    // 临时用户登录
    void loginTempUser();

    // 获取所有视频
    void getAllVideoList();

    // 获取该分类下的视频列表
    void getAllVideoListInKind(int kindId);

    // 获取该标签下的视频列表
    void getAllVideoListInTag(int tagId);

    // 获取该搜索下的视频列表
    void getAllVideoListInSearch(const QString& searchText);

    // 下载图⽚
    void downloadPhoto(const QString& photoFileId);

    // 上传图片
    void uploadPhoto(const QByteArray& photoData, QWidget* whichPage);

    // 下载视频
    void downloadVideo(const QString& videoFileId);

    // 上传视频
    void uploadVideo(const QString& videoPath);

    // 获取弹幕
    void getVideoBarrage(const QString& videoId);

    // 更新播放数量
    void setPlayNumber(const QString &videoId);

    // 获取是否被点赞过
    void getIsLikeVdieo(const QString &videoId);

    // 更新点赞数据
    void setLikeNumber(const QString& videoId);

    // 新增弹幕
    void loadupBarrage(const QString& videoId, model::BarrageInfo barrageInfo);

    // 获取⽤⼾信息
    void getUserInfo(const QString& userId);

    // 修改用户头像Id
    void setAvatar(const QString& fileId);

    // 获取用户视频列表
    void getUserVideoList(const QString& userId, int pageIndex, const QString& whichPage);

    // 删除视频
    void deleteVideo(const QString &videoId);

    // 关注⽤⼾
    void newAttention(const QString& userId);

    // 取消关注⽤⼾
    void delAttention(const QString& userId);

    // 获取验证码
    void getAuthcode(const QString& phoneNum);

    // 短信登录
    void loginWithMessage(const QString& phoneNum, const QString& authcode, const QString& authcodeId);

    // 密码登录
    void loginWithPassword(const QString& phoneNum, const QString& password);

    // session登录
    void loginSession();

    // 退出登录
    void logout();

    // 修改密码
    void setPassword(const QString& password);

    // 修改密码
    void setNickname(const QString& nickname);

    // 新增视频信息
    void uploadVideoDesc(const model::VideoDesc& videoDesc);

    // 获取状态视频列表
    void getStatusVideoList(model::VideoStatus videoStatus, int pageIndex);

    // 视频审核
    void checkVideo(const QString& videoId, bool result);

    // 上架视频
    void putawayVideo(const QString& videoId);

    // 下架视频
    void discardVideo(const QString& videoId);

    // 获取管理员信息--通过手机号
    void getAdminInfoByPhone(const QString& phoneNumber);

    // 获取管理员信息--通过状态
    void getAdminInfoByStatus(int pageIndex, model::AdminStatus adminStatus);

    // 新增管理员
    void newAdmin(const model::AdminInfo& adminInfo);

    // 编辑管理员
    void editAdmin(const model::AdminInfo& adminInfo);

    // 修改管理员状态
    void setAdminStatus(const model::AdminInfo& adminInfo);

    // 删除管理员信息
    void delAdmin(const QString& userId);

private:
    QString HTTP_URL;

    QNetworkAccessManager httpClient;

    model::DataCenter* dataCenter = nullptr;
};

} // end network

#endif // NETCLIENT_H
